/**
 * 1.promise 就是一个类，执行这个类的时候需要传递一个执行器，且立即执行
 * 2.promise 有三种状态 成功： fulfilled,失败： rejected, 等待： pending
 * 且状态一旦确定，不可更改
 * 3.resolve 和reject 函数用来更改状态并传值的
 * 4.then方法来处理内部逻辑。根据状态来决定调用成功或者失败的回调，并且成功传递值，和失败时传递失败原因
 * 
 */
// const MyPromise = require("./myPromise.js")
const myPromise = require("./myPromise.js")

// let promise = new MyPromise((resolve, reject) => {
//     setTimeout(() => {
//         resolve("resolve.....")
//     }, 2000);
//     // throw new Error("executor")
//     // reject("失败")
// })

function p1 () {
    return new myPromise((resolve, reject) => {
        setTimeout(() => {
            resolve("p1")
        }, 2000);
    })
}
function p2 () {
    return new myPromise((resolve, reject) => {
        // resolve("p2 resolve")
        reject("p2 reject")
    })
}
p2().then(res => {
    console.log(res)
}).catch(err => {
    console.log("catch", err)
})

// p2().finally(() => {
//     console.log("finally")
//     return p1()
// }).then(res => {
//     console.log(res)
// }, reason => {
//     console.log(reason)
// })

// MyPromise.resolve("10").then(res => {
//     console.log(res)
//     return 100
// }).then(res => {
//     console.log(res)
// })
// const gg = function () {
//     return new MyPromise((resolve, reject) => {
//         resolve(19992)
//     })
// }
    
// MyPromise.resolve(gg()).then(res => {
//     console.log(res)
// })

// var p1 = function () {
//     return new MyPromise(function(resolve, reject) {
//         setTimeout(() => {
//             resolve("p1")
//         }, 2000);
//     })
//   }
//   function p2() {
//     return new MyPromise(function (resolve, reject) {
//         resolve("p2")
//     })
//   }
//   MyPromise.all(["a", "b", p1(), p2(), "c"]).then(res => {
//     console.log(res)
// })


// promise.then().then().then(res => {
//     console.log("resllll", res)
// })

// promise.then(res => {
//     console.log(res)
//     // throw new Error("then error")
//     return "aaaa"
// }, reason => {
//     console.log(reason)
//     return 10000
// }).then(res => {
//     console.log("res", res)
// })

//  function other() {
//     return new myPromise((resolve, reject) => {
//         resolve("other")
//     })
//  }

//  let p1 = promise.then(res => {
//     console.log("res1: ", res)
//     return p1
//  })
 
//  p1.then(res => {
//     console.log("res2", res)
//  }, reason => {
//     console.log("reason2", reason.message)
//  })
 